package day20170411.homework.teacher.dao;

import java.util.Scanner;
import day20170411.homework.teacher.entity.TeacherEntity;
import utils.ArrayUtil;

public class TeacherDao {
	
	private Scanner scanner = new Scanner(System.in);
	
	/**
	 * 老师的增加
	 * 1.首先校验名字，名字范围2字~4字，输入错误重新输入，要用一个死循环包围住
	 * 2.身份证号码也是一样，范围必须是18为
	 * 3.年龄0~120
	 * 4.工资不限制
	 * 5.性别只有男跟女
	 * @param teacherArrays	需要增加的对象数组
	 * @param teacherInfo	实例的对象
	 */
	public void teacherCreate(TeacherEntity[] teacherArrays,
			TeacherEntity teacherInfo){
		
		//进来先实例一个老师对象用来存储值
		teacherInfo = new TeacherEntity();
		//名字的创建和校验
		while(true){
			System.out.println("输入你要新增老师的名字....");
			String name = scanner.nextLine();
			if(name.length() >= 2 && name.length() <= 4){
				teacherInfo.setName(name);
				break;
			}else{
				System.out.println("你输入的名字不符合，名字范围2字~4字...");
			}
		}
		
		//身份证的创建和校验
		while(true) {
			System.out.println("输入你要新增老师的身份证...");
			String idCard = scanner.nextLine();
			if(idCard.length() == 3){
				teacherInfo.setIdCard(idCard);
				break;
			}else{
				System.out.println("你输入的身份证不符合，身份证必须要18位");
			}
		}
		
		//年龄的创建和校验
		while(true){
			System.out.println("输入你要新增老师的年龄...");
			int age = scanner.nextInt();
			if(age > 0 && age <= 120){
				teacherInfo.setAge(age);
				break;
			}else{
				System.out.println("你输入的年龄不符合，年龄范围为0~120，不能等于0");
			}
		}
		
		//工资的创建和校验
		while(true){
			System.out.println("输入你要新增老师的月薪...");
			double salary = scanner.nextDouble();
			if(salary >= 0){
				teacherInfo.setSalary(salary);
				break;
			}else{
				System.out.println("月薪不能小于0...");
			}
		}
		
		//性别的创建和校验
		while(true){
			System.out.println("输入你要新增老师的性别...");
			char sex = scanner.next().charAt(0);
			if(sex == '男' || sex == '女'){
				teacherInfo.setSex(sex);
				break;
			}else{
				System.out.println("性别只能男跟女...");
			}
		}
		
		//把数组的长度最后一位拿出来
		int length = teacherArrays.length-1;
		//把刚刚输入的数据加到数组的最后一位
		teacherArrays[length] = teacherInfo;
		
		System.out.println("增加成功");
		
		//调用工具类进行查询
		ArrayUtil.arrayPrint(teacherArrays);
	}
	
	/**
	 * 老师删除(这个删除可以删除多个，也可以删除1个)
	 * 1.定义一个新的数组，存放不需要删除老师的对象数组
	 * 2.定义一个布尔类型和变量用来判断是否有重复和新的数组下标赋值
	 * 3.首先循环老师的数组，再循环变长参数的数组
	 * 4.等变长参数的循环全部循环完如果布尔类型还是为true，代表可以装进新的数组，通过刚刚定义变量赋值
	 * @param teacherArrays		需要删除的数组
	 * @param args				需要删除的名字（变长参数，可以多个可1个）
	 */
	public TeacherEntity[] teacherDelete(TeacherEntity[] teacherArrays,String...args){ 
		//第一次循环拿到新数组的长度
		int count = 0;
		//判断老师可以装进新的数组
		boolean find = true;
		//这是新数组的赋值下标
		int newArraysLength = 0;
		//第一次循环老师的数组
		for(int index=0; index<teacherArrays.length; index++){
			//通过对象数组拿到老师的对象
			TeacherEntity teacherObject = teacherArrays[index];
			//防止空指针
			if(teacherObject != null){
				//拿到老师的名字
				String teacherName = teacherObject.getName();
				//每次进来都要变成true，false的话代表不可以装进新的数组（下面是重点）
				find = true;
				//循环变长参数的数组
				for(int inner=0; inner<args.length; inner++){
					//拿到变长参数的老师名字
					String argsName = args[inner];
					//校验老师的名字是否跟变长参数的值是否相同
					if(teacherName.equals(argsName)){
						//如果相同了，代表不可以装进新的数组，所以等于false
						find = false;
					}
				}
				//如果布尔为true了，代表可以装进新的数组
				if(find){
					count++;
				}
			}
		}
		
		
		//不需要删除老师对象的数组，长度（count）
		TeacherEntity[] newArrays = new TeacherEntity[count];
		//第一次循环老师的数组
		for(int index=0; index<teacherArrays.length; index++){
			//通过对象数组拿到老师的对象
			TeacherEntity teacherObject = teacherArrays[index];
			//防止空指针
			if(teacherObject != null){
				//拿到老师的名字
				String teacherName = teacherObject.getName();
				//每次进来都要变成true，false的话代表不可以装进新的数组（下面是重点）
				find = true;
				//循环变长参数的数组
				for(int inner=0; inner<args.length; inner++){
					//拿到变长参数的老师名字
					String argsName = args[inner];
					//校验老师的名字是否跟变长参数的值是否相同
					if(teacherName.equals(argsName)){
						//如果相同了，代表不可以装进新的数组，所以等于false
						find = false;
					}
				}
				//如果布尔为true了，代表可以装进新的数组
				if(find){
					//把老师的对象装进新的数组
					newArrays[newArraysLength] = teacherObject;
					//下标不能超过新数组的长度
					if(newArraysLength != newArrays.length){
						//赋值完必须++，否则新的会覆盖原来的
						newArraysLength++;
					}
				}
			}
		}
		
		//返回新的数组
		return newArrays;
	}
	
	/**
	 * 老师修改
	 * 1.必须要校验用户输入的老师是否存在
	 * 2.然后提示一下用户修改的老师是否符合他输入的老师
	 * 3.提示   确认是否修改？   是/否
	 * 4.然后校验用户输入的年龄是否符合
	 * 5.再把校验老师名字的下标进行修改
	 * 6.提示修改成功
	 * @param teacherArrays		需要修改的对象数组
	 * @param scanner			用户输入
	 */
	public void teacherUpdate(TeacherEntity[] teacherArrays,Scanner scanner){
		while(true){
			System.out.println("输入你要修改的老师...");
			//拿到用户输入的名字
			String name = scanner.nextLine();
			//校验输入的老师是否存在
			int index = new TeacherDao().teacherGudge(teacherArrays, name);
			//如果下标不等于-1，代表存在这位老师
			if(index != -1){
				while(true){
					System.out.println("找到改下的老师...");
					System.out.println("名字：" + teacherArrays[index].getName());
					System.out.println("年龄：" + teacherArrays[index].getAge());
					System.out.println("工资：" + teacherArrays[index].getSalary());
					System.out.println("确认是否修改？   是/否");
					//拿到用户输入的字符串
					String check = scanner.nextLine();
					
					if("是".equals(check)){
						System.out.println("输入你要修改老师的年龄...");
						//拿到用户输入的年龄
						int age = scanner.nextInt();
						//校验年龄是否符合范围
						if(age > 0 && age <= 120){
							System.out.println("输入你要修改老师的月薪...");
							//拿到用户输入的月薪
							double salary = scanner.nextDouble();
							//通过对应的下标修改对应的老师
							teacherArrays[index].setAge(age);
							teacherArrays[index].setSalary(salary);
							System.out.println("修改成功！");
							//结束（年龄判断的循环）
							break;
						}else{
							System.out.println("你输入的年龄不符合范围，年龄范围为0~120");
						}
					}else if("否".equals(check)){
						System.out.println("退出成功...");
						//用户退出
						break;
					}else{
						System.out.println("你输入的是无效的，请重新输入");
					}
				}
				//结束（校验老师是否存在）的循环
				break;
			}else{
				System.out.println("你输入的老师不存在，请重新输入...");
			}
		}
	}
	
	/**
	 * 校验老师是否存在这个数组
	 * @param teacherArrays	需要校验的对象数组
	 * @param name			需要校验的名字
	 * @return				如果存在返回对应下标，否则返回-1代表不存在
	 */
	public int teacherGudge(TeacherEntity[] teacherArrays,String name){
		//对应老师的下标
		int xb = -1;
		for(int index=0; index<teacherArrays.length; index++){
			//校验是否空指针
			if(teacherArrays[index] != null){
				//把数组里面的对象拿出来
				TeacherEntity teacherObject = teacherArrays[index];
				//把对象里面的名字拿出来，方便于调试，看看是拿到值
				String teacherName = teacherObject.getName();
				//校验你传进来的老师是否存在
				if(name.equals(teacherName)){
					//找到老师，返回对应的下标
					return index;
				}
			}
		}
		//不存在返回-1
		return xb;
	}
}
